package mockitoPoker;

import static org.junit.Assert.*;
import static org.mockito.Mockito.*;

import org.junit.Before;
import org.junit.Test;
import org.mockito.InOrder;
import poker.PokerStatus;
import cartaPoker.CartaPoker;

public class mockitoPokerVerificarPokerTest {

	PokerStatus controladorPoker;
	CartaPoker primeraCarta;
	CartaPoker segundaCarta;
	CartaPoker terceraCarta;
	CartaPoker cuartaCarta;
	CartaPoker quintaCarta;

	/**
	 * @throws java.lang.Exception
	 */
	@Before
	public void setUp() throws Exception {
		this.controladorPoker = new PokerStatus();
		primeraCarta = mock(CartaPoker.class);
		segundaCarta = mock(CartaPoker.class);
		terceraCarta = mock(CartaPoker.class);
		cuartaCarta = mock(CartaPoker.class);
		quintaCarta = mock(CartaPoker.class);

	}

	@Test
	public void siTodasLasCartasSonDeNumerosDiferentesPeroDelMismoPaloElMetodoVerificarDebeRetornarFalso() {

		
		
		
		InOrder inOrder = inOrder(primeraCarta); 
		
		when(primeraCarta.valor()).thenReturn(2);
		when(primeraCarta.palo()).thenReturn("P");
		
		
		verify(primeraCarta,never()).valor();
		
		
		when(primeraCarta.valor()).thenReturn(2);
		when(primeraCarta.palo()).thenReturn("P");
		
		when(segundaCarta.valor()).thenReturn(8);
		when(segundaCarta.palo()).thenReturn("P");
		
		when(primeraCarta.valor()).thenReturn(9);
		when(primeraCarta.palo()).thenReturn("P");
		
		when(terceraCarta.valor()).thenReturn(14);
		when(terceraCarta.palo()).thenReturn("P");
		
		when(cuartaCarta.valor()).thenReturn(7);
		when(cuartaCarta.palo()).thenReturn("P");
		
		when(quintaCarta.valor()).thenReturn(5);
		when(quintaCarta.palo()).thenReturn("P");
		
		
		
		
		assertFalse(controladorPoker.verificar(primeraCarta, segundaCarta, terceraCarta, cuartaCarta, quintaCarta) == "Poker");
		//inOrder.verify(firstMock).add("was called first");
		//inOrder.verify(secondMock).add("was called second");
		
		
		
		verify(primeraCarta).valor();
		verify(cuartaCarta,never()).valor();
		verify(quintaCarta,never()).valor();
		
		inOrder.verify(primeraCarta).valor();
		inOrder.verify(primeraCarta).palo();
	}

	@Test
	public void siTodasLasCartasSonDeNumerosyDeDiferentePaloElMetodoVerificarDebeRetornarFalso() {

		primeraCarta = new CartaPoker("P", "A");
		segundaCarta = new CartaPoker("T", "2");
		terceraCarta = new CartaPoker("P", "3");
		cuartaCarta = new CartaPoker("P", "5");
		quintaCarta = new CartaPoker("P", "6");

		assertFalse(controladorPoker.verificar(primeraCarta, segundaCarta,
				terceraCarta, cuartaCarta, quintaCarta) == "Poker");

	}

	@Test
	public void siSeDanPorLoMenosDosCartasDiferentesElMetodoVerificarDebeRetornarFalso() {

		primeraCarta = new CartaPoker("P", "A");
		segundaCarta = new CartaPoker("D", "2");
		terceraCarta = new CartaPoker("C", "3");
		cuartaCarta = new CartaPoker("P", "5");
		quintaCarta = new CartaPoker("P", "6");

		assertFalse(controladorPoker.verificar(primeraCarta, segundaCarta,
				terceraCarta, cuartaCarta, quintaCarta) == "Poker");

	}

	@Test
	public void siSeDanPorLoMenosTresCartasDiferentesElMetodoVerificarDebeRetornarFalso() {

		primeraCarta = new CartaPoker("P", "A");
		segundaCarta = new CartaPoker("P", "2");
		terceraCarta = new CartaPoker("P", "3");
		cuartaCarta = new CartaPoker("P", "5");
		quintaCarta = new CartaPoker("P", "6");

		assertFalse(controladorPoker.verificar(primeraCarta, segundaCarta,
				terceraCarta, cuartaCarta, quintaCarta) == "Poker");

	}

	@Test
	public void siSeDanPorLoMenosCuatroCartasIgualesElMetodoVerificarDebeRetornarVerdadero() {
		primeraCarta = new CartaPoker("P", "2");
		segundaCarta = new CartaPoker("D", "2");
		terceraCarta = new CartaPoker("P", "3");
		cuartaCarta = new CartaPoker("P", "2");
		quintaCarta = new CartaPoker("P", "2");

		assertTrue(controladorPoker.verificar(primeraCarta, segundaCarta,
				terceraCarta, cuartaCarta, quintaCarta) == "Poker");

	}

	@Test
	public void siLaPrimeraCartaEsLaDiferenteElMetodoDaVerdadero() {
		primeraCarta = new CartaPoker("P", "A");
		segundaCarta = new CartaPoker("T", "2");
		terceraCarta = new CartaPoker("P", "2");
		cuartaCarta = new CartaPoker("P", "2");
		quintaCarta = new CartaPoker("P", "2");

		assertTrue(controladorPoker.verificar(primeraCarta, segundaCarta,
				terceraCarta, cuartaCarta, quintaCarta) == "Poker");
	}

	@Test
	public void siLaSegundaCartaEsLaUnicaDiferenteDaVerdadero() {
		primeraCarta = new CartaPoker("P", "A");
		segundaCarta = new CartaPoker("D", "2");
		terceraCarta = new CartaPoker("P", "A");
		cuartaCarta = new CartaPoker("P", "A");
		quintaCarta = new CartaPoker("P", "A");

		assertTrue(controladorPoker.verificar(primeraCarta, segundaCarta,
				terceraCarta, cuartaCarta, quintaCarta) == "Poker");
	}

	@Test
	public void siLaTerceraCartaEsLaUnicaDiferenteDaVerdadero() {
		primeraCarta = new CartaPoker("P", "2");
		segundaCarta = new CartaPoker("P", "2");
		terceraCarta = new CartaPoker("T", "3");
		cuartaCarta = new CartaPoker("P", "2");
		quintaCarta = new CartaPoker("P", "2");
		assertTrue(controladorPoker.verificar(primeraCarta, segundaCarta,
				terceraCarta, cuartaCarta, quintaCarta) == "Poker");

	}

	@Test
	public void siLaCuartaCartaEsLaDiferenteDaVerdadero() {
		primeraCarta = new CartaPoker("P", "6");
		segundaCarta = new CartaPoker("T", "6");
		terceraCarta = new CartaPoker("P", "6");
		cuartaCarta = new CartaPoker("D", "5");
		quintaCarta = new CartaPoker("P", "6");

		assertTrue(controladorPoker.verificar(primeraCarta, segundaCarta,
				terceraCarta, cuartaCarta, quintaCarta) == "Poker");

	}

	@Test
	public void siLaQuintaCartaEsLaDiferenteDaVerdadero() {
		primeraCarta = new CartaPoker("P", "5");
		segundaCarta = new CartaPoker("P", "5");
		terceraCarta = new CartaPoker("T", "5");
		cuartaCarta = new CartaPoker("P", "5");
		quintaCarta = new CartaPoker("P", "6");

		assertTrue(controladorPoker.verificar(primeraCarta, segundaCarta,
				terceraCarta, cuartaCarta, quintaCarta) == "Poker");

	}

}
